#ifndef _VIPCARDMANAGER_H
#define _VIPCARDMANAGER_H

#include "Common.h"
#include "String.h"
#include "Resource.h"
#include "StringConverter.h"

class CharPtr;
class XMLDataSet;
// VIP标记
enum en_VipFlag
{
	en_VipFlag_None = 0,	
	en_VipFlag_NoMammon = 1,// 财神卡不生效
	en_VipFlag_NoMore = 2,	// 不能重复购买
	en_VipFlag_Discount = 4,// 打折活动
};
// VIP卡类型
enum en_VipType
{
	en_VipType_VIP = 1,			// VIP
	en_VipType_Authority = 2,	// 权限
	en_VipType_Medal = 3,		// 勋章
	en_VipType_Welfare = 4,		// 福利卡
	en_VipType_Coins = 5,		// 铜钱
	en_VipType_FirstBuy = 6,	// 首充
	en_VipType_Body = 7,		// 形象
	en_VipType_WelfareTimer = 8,// 周期卡
	en_VipType_OutSideFlag = 9,	// 外围标记（如代理权等）
};

// VIP卡
struct VIPCard
{
	uint32 id;			// VIP_ID
	uint32 type;		// 类型
	uint32 coins;		// 铜钱
	uint32 money;		// 元宝
	uint32 bugle;		// 喇叭
	uint32 diamand;		// 房卡
	uint32 signin;		// 签到卡
	uint32 days;		// 有效期
	uint32 flag;		// 标志
	uint32 lgAdd;		// 登录奖励
	uint32 jjAdd;		// 救济加成
	uint32 hongbao;		// 赠送红包
	uint32 abate;		// 礼包打折
	uint32 brow;		// 表情礼包
	bool b2Exp;			// 双倍经验
	bool bShow;			// 是否显示图标
	uint32 morraNum;	// 猜拳数量
	uint32 vip_id;		// VIP ID
	uint32 vip_day;		// VIP天数
	String key;			// KEY值
	String name;		// 名称
	VIPCard():id(0),type(0),coins(0),money(0),bugle(0),diamand(0),signin(0),days(0),flag(0),lgAdd(0),jjAdd(0),hongbao(0),abate(0),brow(0),b2Exp(0),bShow(0),morraNum(0),vip_id(0), vip_day(0){}
	bool isNull()
	{
		return (id == 0);
	}
};

#define WGS_VIP_READ_WRITE_MUTEX_NAME      vip_read_write_shared_mutex
#define WGS_VIP_READ_WRITE_MUTEX   mutable boost::shared_mutex WGS_VIP_READ_WRITE_MUTEX_NAME;
#define WGS_VIP_READ_LOCK             boost::shared_lock<boost::shared_mutex>  wgsVipSharedMutexLock(WGS_VIP_READ_WRITE_MUTEX_NAME);
#define WGS_VIP_WRITE_LOCK 		boost::unique_lock<boost::shared_mutex>  wgsVipWriteMutexLock(WGS_VIP_READ_WRITE_MUTEX_NAME); 

/** vip信息存储在角色表的关键字 **/
// #define CARDID "VIP_CARDID_"
// #define CARDDATE "VIP_VIPDATE_"
// #define VIPCARDID(id) ("VIP_CARDID_" + StringConverter::toString(id))
#define VIPCARDDATE(id) ("VIP_VIPDATE_" + StringConverter::toString(id))
#define VIPEXPSDATE 	"VIP_2EXPSDATE"
#define VIPABATEDATE 	"VIP_ABATEDATE"
#define VIPMORRADATE 	"VIP_MORRADATE"
#define VIPMORRANUM 	"VIP_MORRANUM"
#define LUCKY_EXPS 		"LUCKY_EXPS"
#define TUHAO_EXPS		"TUHAO_EXPS"
#define USERBUYVIP_TIME "USERBUYVIP_TIME"
#define VIP_WELFARE 	"VIP_WELFARE"
#define BODY_DATA 		"BODY_DATA"


class VipCardManager : public Singleton<VipCardManager>
{
	WGS_VIP_READ_WRITE_MUTEX
public:
	VipCardManager();
	~VipCardManager();
	// 重新加载VIP卡
	bool ReloadVipCards();
	// 获取VIP卡
	VIPCard GetVipCard(const uint32 id);
	// 添加VIP、勋章相关信息
	void AddNewVIPInfo(CharPtr &pChr, VIPCard &vipCard);
	// 更新VIP相关时间
	void UpdateVIPValue(CharPtr &pChr, const String &key, const uint32 value);
	// 添加VIP勋章数据
	void AddVipValue(CharPtr &pChr, const String &key, const uint32 value);
	// vip时间更新
	void UpdateVIPDate(CharPtr &pChr);
	// 商品道具打折
	const uint32 GoodsCutPrice(CharPtr &pChr, const uint32 price);
	// 经验翻番
	void AddExps(CharPtr &pChr, uint32 &exps);
	// 登录加成
	void AddLoginGift(CharPtr &pChr, uint32 &coins);
	// 救济加成
	void AppendSubsidyGift(CharPtr &pChr, uint32 &coins);
	// 添加VIP勋章（指定到期时间）
	void AddVipInfo(CharPtr &pChr, VIPCard &vipCard, const uint32 endTime);
	// 移除所有VIP勋章
	void RemoveVipInfo(CharPtr &pChr);
	// 添加猜拳次数
	void AddMorraNum(CharPtr &pChr, uint32 num);
	// 猜拳
	bool Morra(CharPtr &pChr);
	// 获取猜拳次数
	uint32 GetMorraLeftNum(CharPtr &pChr);
	// 判断是否存在VIP
	bool HaveVIPCard(CharPtr &pChr, const uint32 & vipid);
	// 获取VIP勋章图标ID
	uint32 GetUsedVipId(CharPtr &pChr);
	uint32 GetUsedVipId(XMLDataSet &user_data);
	// 获取福利卡列表
	void GetWelfareList(std::list<VIPCard> &lstWelfare);
	// 获取身上福利卡列表,返回总金额
	uint32 GetSelfWelfareList(CharPtr &pChr, std::list<VIPCard> &lstWelfare);
	// 是否有福利卡
	bool HaveWelfare(CharPtr & pChr);
public:
	////////////数据中转相关///////////	
	// 获取VIP的XML数据
	bool GetVipXmlData(CharPtr & pChr, XMLDataSet & vipXml);
	// 设置VIP的XML数据
	void SetVipXmlData(CharPtr & pChr, XMLDataSet & vipXml);
	// 清空VIP的XML数据(如没有VIP数据则返回false)
	bool ClearVipXmlData(CharPtr & pChr);	
	
public:
	// 将VIP数据追加到其他封包
	void PacketVipInfo(WorldPacket * packet, CharPtr &pChr);
	// 将VIP勋章图标追加到其他封包
	void PacketVipIcon(WorldPacket * packet, CharPtr &pChr);
	// 更新VIP勋章信息
	bool CreateUpdateVipDataPacket(WorldPacket * packet, CharPtr &pChr);
	// 获取玩家vip勋章图标
	bool CreateGetVipIconPacket(WorldPacket * packet, CharPtr &pChr);
	// 下发玩家剩余猜拳次数
	bool CreateUpdateMorraNum(WorldPacket * packet, CharPtr & pChr);

public:
	// 加载幸运值系统
	bool LoadLuckyExpsXml();
	bool ReLoadLuckyExpsXml();
	// 当前幸运值等级
	const uint8 GetCurrentLuckyLevel(const uint32 & exps,uint32 & currExps);
	// 得到下一级升级经验
	const uint32 GetLuckyNextLevelExps(const uint8 level);
	// 得到幸运值最大等级
	const uint8 GetLuckyExpMaxLevel();
	
private:
	// 加载VIP卡
	bool LoadVipCards();
	// 获取有效VIP卡、勋章
	void GetUsedVipCardsList(CharPtr &pChr, std::list<VIPCard> &lstVipCards);
	// 获取有效的vip
	bool GetUsedVip(CharPtr &pChr, VIPCard &vipCard);
	// 添加VIP、勋章有效时间
	void AddVIPDate(CharPtr &pChr, const String key, const uint32 addTime);
	// 更新VIP数据（图标）
	void UpdateVIPData(CharPtr &pChr);
private:
	// vip卡
	std::map<uint32, VIPCard> m_mapVipCards;
	// 幸运值经验配置
	std::map<uint8, uint32> m_mapLuckyExps;
};

#define   sVipCardMgr   VipCardManager::getSingleton()

#endif // _VIPCARDMANAGER_H
